
/**
 * 
 * 光伏场地建设规划
 * 
 * 题目描述

祖国西北部有一片大片荒地，其中零星的分布着一些湖泊，保护区，矿区；

整体上常年光照良好，但是也有一些地区光照不太好。

某电力公司希望在这里建设多个光伏电站，生产清洁能源对每平方公里的土地进行了发电评估，其中不能建设的区域发电量为 0 kw，可以发电的区域根据光照，地形等给出了每平方公里年发电量 x 千瓦。

我们希望能够找到其中集中的矩形区域建设电站，能够获得良好的收益。

输入描述
第一行输入为调研的地区长，宽，以及准备建设的电站【长宽相等，为正方形】的边长，最低要求的发电量。

之后每行为调研区域每平方公里的发电量。

例如，输入为：

2 5 2 6
1 3 4 5 8
2 3 6 7 1
表示调研的区域大小为长 2 宽 5 的矩形，我们要建设的电站的边长为 2，建设电站最低发电量为 6

输出描述
输出为这样的区域有多少个？

上述输入长度为 2 的正方形满足发电量大于等于 6 的区域有 4 个。则输出为：

4
备注
其中被调研的区域的长宽均大于等于 1，建设电站的边长大于等于 1，任何区域的发电量大于等于 0

用例
输入	2 5 2 6
1 3 4 5 8
2 3 6 7 1
输出	4
说明	
输入长为2，宽为5的场地，建设的场地为正方形场地，边长为2，要求场地的发电量大于等于6
输入	2 5 1 6
1 3 4 5 8
2 3 6 7 1
输出	3
说明	输入长为2，宽为5的场地，建设的场地为正方形场地，边长为1，要求场地的发电量大于等于6
输入	2 5 1 0
1 3 4 5 8
2 3 6 7 1
输出	10
说明	输入长为2，宽为5的场地，建设的场地为正方形场地，边长为1，要求场地的发电量大于等于0

 * 
 */

import java.util.Scanner;

/**
  * 
  题目解析
本题中有一句比较有歧义的话

其中不能建设的区域发电量为0kw
这里不能建设是什么意思？不能建设发电站吗？还是说单纯只是产出0发电量？

如果含义是不能建设发电站，那意思应该是，正方形发电站区域如果含0的话，则不能建设发电站。

如果含义是单纯发电量0，那应该没有什么影响。

下面我源码中，我对这两种情况都做了实现了。考试时，大家可以都试试。

2023.04.17

根据考友反馈，发电量为0的区域也可以建站。

本题可以使用二维数组前缀和求解，关于二维矩阵前缀和，请看算法设计 - 前缀和 & 差分数列_伏城之外的博客-CSDN博客

  */
public class 光伏场地建设规划 {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        int r = sc.nextInt();
        int c = sc.nextInt();
    
        int s = sc.nextInt();
        int min = sc.nextInt();
    
        int[][] matrix = new int[r][c];
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                matrix[i][j] = sc.nextInt();
            }
        }
    
        System.out.println(getResult(matrix, r, c, s, min));
  }
 
  /**
   * @param matrix 调研区域每单元面积的发电量矩阵
   * @param r 调研区域的长，即行数
   * @param c 调研区域的宽，即列数
   * @param s 正方形电站的边长
   * @param min 正方形电站的最低发电量
   * @return 调研区域内有几个符合要求的正方形发电站
   */
  public static int getResult(int[][] matrix, int r, int c, int s, int min) {
    int[][] preSum = new int[r + 1][c + 1];
 
    for (int i = 1; i <= r; i++) {
      for (int j = 1; j <= c; j++) {
        preSum[i][j] =
            preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1] + matrix[i - 1][j - 1];
      }
    }
 
    int ans = 0;
 
    for (int i = s; i <= r; i++) {
      for (int j = s; j <= c; j++) {
        int square = preSum[i][j] - (preSum[i - s][j] + preSum[i][j - s]) + preSum[i - s][j - s];
        if (square >= min) ans++;
      }
    }
 
    return ans;
  }
}
